# 类和对象：类是对象的抽象、对象是类的具体实现
# 类的定义
'''
class 类名(父类):
    # 初始化方法：主要用于初始化对象的属性
    def __init__(self,name,age,参数):
        # 类的属性 在Python定义即赋值
        self.name = name
        self.age = age
        self.属性 = 值（固定、传入的）
    # 声明其他函数
    def func1(self,参数):
        # 获取对象的属性:使用self.属性(在初始化方法中定义的)
        print(self.name)
'''


# 类的实例化(创建对象)
# 类名(__init__方法需要的参数（self参数不需要手动传入）)

# 定义一个学生类
# 属性：id、name、age、clazz
# 方法：learning()
class Student():
    def __init__(self, id, name, age, clazz):
        self.id = id
        self.name = name
        self.age = age
        self.clazz = clazz
        # Python中的封装(非严格意义上的封装)
        # 如果想要让定义的属性不被外部访问
        # 可以在属性名之前加两个__下划线
        # Python中的封装更多的是靠程序员的严谨
        self.__secret = "这是一个秘密"

    def learning(self, subject):
        print("%s learn %s" % (self.name, subject))

    # 对方法的封装 同对属性的封装
    def __func1(self):
        pass


student1 = Student('0001', 'zhangSan', 18, '文科一班')
student2 = Student('0002', 'liSi', 20, '理科一班')

# 取对象中的属性
# 对象名.属性名
print(student1.name)
print(student2.name)
# print(student1.__secret)  # 做了封装 无法直接通过属性名将对应的值取出来
print(student1._Student__secret)  # 但还是可以通过 _类名+属性名 取出来
student2.secret = "修改了秘密"
print(student2.secret)
student2.height = 180
print(student2.height)
# print(student1.height)

# 调用对象的方法
# 对象名.方法名(参数)
student1.learning('math')
student2.learning('Chinese')

# 同调用封装的属性
student1._Student__func1()
